package com.skivingcloud.admin.sys.service;

import com.skivingcloud.admin.sys.entity.AppRouteRecordRaw;
import com.skivingcloud.admin.sys.entity.MenuBean;
import com.skivingcloud.admin.sys.entity.SysMenu;
import com.skivingcloud.admin.sys.entity.User;
import com.skivingcloud.common.utils.TreeUtils;

import net.sf.json.JSONObject;

import java.util.List;
import java.util.Map;
import java.util.Set;

import com.baomidou.mybatisplus.extension.service.IService;

/**
 * <p>
 * 菜单管理 服务类
 * </p>
 *
 * @author skivingcloud
 * @since 2022-01-29
 */
public interface ISysMenuService extends IService<SysMenu> {

	/**
	 * 根据终端获取导航菜单
	 * 
	 * @param id
	 * @param terminals
	 * @return
	 */
	List<MenuBean> getUserMenuList(String id, String terminal, String sessionId);

	/**
	 * 根据终端获取有权限的按钮
	 * 
	 * @param id
	 * @param terminals
	 * @return
	 */
	Set<String> getUserPermissions(String id, String terminal);

	/**
	 * 导航菜单,常用菜单可选范围
	 * 
	 * @param id
	 * @param terminal
	 * @return
	 */
	List<Map<String, Object>> getCommUseMenuSetTree(String id, String value);

	/**
	 * 查询已设置的常用菜单
	 * 
	 * @param id
	 * @param terminal
	 * @return
	 */
	List<MenuBean> getMenuCheckList(String id, String terminal);

	/**
	 * 设置常用菜单
	 * 
	 * @param ids  选中节点的id数组
	 * @param user 当前用户
	 */
	void saveCommUseMenu(String[] ids, User user);

	/**
	 * 根据终端去常用菜单
	 * 
	 * @param id
	 * @param terminal
	 * @return
	 */
	List<MenuBean> getCommUseMenuTreeByTerminal(String id, String[] terminals);

	/**
	 * 根据父菜单，查询子菜单
	 * 
	 * @param parentId   父菜单ID
	 * @param menuIdList 用户菜单ID
	 */
	List<MenuBean> queryListParentId(String parentId, List<String> menuIdList);

	/**
	 * 根据父菜单，查询子菜单
	 * 
	 * @param parentId 父菜单ID
	 */
	List<MenuBean> queryListParentId(String parentId);

	/**
	 * 记录用户菜单点击
	 * 
	 * @param menuId
	 * @param user
	 * @throws Exception
	 */
	void menuClick(String menuId, User user) throws Exception;

	/**
	 * 根据菜单终端类型获取菜单树，如果不是超级管理员只返回自己租户的资源
	 * 
	 * @param terminals 终端
	 * @param user
	 * @return
	 * @throws Exception
	 */
	List<TreeUtils> gerResTreeByTerminal(List<String> terminals, User user) throws Exception;

	/**
	 * 列表查询
	 * 
	 * @param obj
	 * @return
	 */
	List<SysMenu> selectList(JSONObject obj);

	List<MenuBean> queryNotButtonList();

	void insert(SysMenu menu);

	void delete(String id);

	void updateByIdMe(SysMenu menu);

	/**
	 * 根据终端获取导航菜单
	 * 
	 * @param id
	 * @param terminal
	 * @param sessionId
	 * @return
	 */
	List<AppRouteRecordRaw> getUserMenuListRoute(String id, String terminal, String sessionId);

	/**
	 * 根据终端获取导航菜单
	 * 
	 * @param id
	 * @param terminal
	 * @return
	 */
	List<Map<String, Object>> getUserMenuListData(String id, String terminal);
}
